package cxydmmszl.chapter04.t067;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.HashMap;

/**
 * <li style="color: red;">Prob</li>
 * 子数组异或和为0的最多划分
 * <li style="color: green;">Desc</li>
 * 给定一个整型数组arr，其中可能有正有负有零。
 * 你可以随意把整个数组切成若干个不相容的子数组，求异或和为0的子数组最多可能有多少个？
 * 整数异或和定义：把数组中所有的数异或起来得到的值。
 * <li style="color: green;">Input</li>
 * 输出包括两行，第一行一个整数，代表数组长度 n(1≤n≤10^6)。
 * 第二行有 n 个整数，代表数组 (−1e9≤arr[i]≤1e9)。
 * <li style="color: green;">Output</li>
 * 输出一个整数，表示数组切割最多的子数组的个数。
 * <li style="color: blue;">Link</li> CD42
 *
 * @author habitplus
 * @since 2021-10-08 21:48
 */
public class Main {
    static final StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static int nextInt() {
        try {
            st.nextToken();
            return (int) st.nval;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static void main(String[] args) {
        int n = nextInt();
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = nextInt();
        }

        int ans = solve(arr);
        System.out.println(ans);
    }

    private static int solve(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }

        int n = arr.length;
        // dp[i] 表示包含 arr[i] 的分割 arr[0,i] 的子数组的最大个数
        int[] dp = new int[n];
        HashMap<Integer, Integer> map = new HashMap<>();
        int eor = 0;
        int k;

        dp[0] = arr[0] == 0 ? 1 : 0;
        map.put(0, -1);
        map.put(arr[0], 0);
        for (int i = 1; i < n; i++) {
            eor ^= arr[i];
            if (map.containsKey(eor)) {
                k = map.get(eor);
                dp[i] = k != -1 ? dp[k] + 1 : 1;
            }
            dp[i] = Math.max(dp[i - 1], dp[i]);
            map.put(eor, i);
        }

        return dp[n - 1];
    }
}
